#pragma once

#include <iostream>
#include <memory>
#include <unistd.h>
#include "Socket.hpp"

using namespace SocketModule;

class SelectServer
{
public:
    SelectServer(int port):_listensock(std::make_unique<TcpSocket>()), _isrunning(false)
    {
        _listensock->BuildTcpSocketMethod(port);
    }
    void Start()
    {
        _isrunning = true;
        while(_isrunning)
        {
            // 因为: listensockfd,也是一个fd，进程怎么知道listenfd上面有新连接到来了呢？
            // auto res = _listensock->Accept(); // 我们在select这里，可以进行accept吗？
            // 将listensockfd添加到select内部，让OS帮我关心listensockfd上面的读事件
            fd_set rfds;    // 定义fds集合
            FD_ZERO(&rfds); // 清空fds
            FD_SET(_listensock->Fd(), &rfds); // 有没有设置到内核中？1 or 0

            // 暂时
            int n = select(_listensock->Fd()+1, &rfds, nullptr, nullptr, nullptr);
            // TODO
        }
        _isrunning = false;
    }
    void Stop()
    {
        _isrunning = false;
    }
    ~SelectServer()
    {}
private:
    std::unique_ptr<Socket> _listensock;
    bool _isrunning;
};